package pe.gob.mininter.dirandro.vaadin.panel.util;

import java.util.List;

import org.apache.commons.lang.StringUtils;

import pe.gob.mininter.dirandro.model.ModeloMarca;
import pe.gob.mininter.dirandro.model.Valor;
import pe.gob.mininter.dirandro.model.Vehiculo;
import pe.gob.mininter.dirandro.service.ModeloMarcaService;
import pe.gob.mininter.dirandro.service.VehiculoService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.vaadin.dialogs.AlertDialog;
import pe.gob.mininter.dirandro.vaadin.util.ComboBoxLOVS;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.ui.AbstractSelect.Filtering;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;


public class PanelAgregarVehiculo extends CustomComponent implements ClickListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout pnlBody;
	@AutoGenerated
	private HorizontalLayout pnl6;
	@AutoGenerated
	private Button btnRegistrarVehiculo;
	@AutoGenerated
	private HorizontalLayout pnl4;
	@AutoGenerated
	private ComboBox cmbModelo;
	@AutoGenerated
	private ComboBox cmbMarca;
	@AutoGenerated
	private HorizontalLayout pnl3;
	@AutoGenerated
	private TextField txtModeloEspecifico;
	@AutoGenerated
	private TextField txtSerieMotor;
	@AutoGenerated
	private TextField txtSerieChasis;
	@AutoGenerated
	private HorizontalLayout pnl2;
	@AutoGenerated
	private TextField txtPlaca;
	@AutoGenerated
	private ComboBoxLOVS cmbPeriodo;
	@AutoGenerated
	private ComboBoxLOVS cmbColor;
	@AutoGenerated
	private HorizontalLayout pnl1;
	@AutoGenerated
	private ComboBoxLOVS cmbCilindraje;
	@AutoGenerated
	private ComboBoxLOVS cmbTransmision;
	@AutoGenerated
	private ComboBoxLOVS cmbTipo;
	private static final long serialVersionUID = -1544986287716283352L;
	
	private ModeloMarcaService modeloMarcaService;
	private VehiculoService vehiculoService;
	private Vehiculo vehiculo;
	
	private List<ModeloMarca> lstMarcas;
	private List<ModeloMarca> lstModelos;
		
	public Vehiculo getVehiculo() {
		return vehiculo;
	}

	public void setVehiculo(Vehiculo vehiculo) {
		this.vehiculo = vehiculo;
	}

	public PanelAgregarVehiculo() {
		buildMainLayout();
		modeloMarcaService = Injector.obtenerServicio(ModeloMarcaService.class);
		vehiculoService = Injector.obtenerServicio(VehiculoService.class);
		setCompositionRoot(mainLayout);
		postConstruct();
	}

	public void postConstruct() {
		btnRegistrarVehiculo.addListener((ClickListener) this);
		cmbTipo.setInputPrompt("Tipo de Vehículo");
		cmbCilindraje.setInputPrompt("Nro de Cilindros");
		cmbColor.setInputPrompt("Color del Vehículo");
		cmbPeriodo.setInputPrompt("Año de Fabricación");
		cmbTransmision.setInputPrompt("Tipo de Transmisión");
		cmbMarca.setInputPrompt("Marca del Vehículo");
		cmbModelo.setInputPrompt("Modelo del Vehículo");
		
		cmbTipo.setCodigoLista(Constante.LISTA.CODIGO.TIPO_VEHICULO);
		cmbCilindraje.setCodigoLista(Constante.LISTA.CODIGO.CILINDRAJE);
		cmbColor.setCodigoLista(Constante.LISTA.CODIGO.COLOR);
		cmbPeriodo.setCodigoLista(Constante.LISTA.CODIGO.PERIODO);
		cmbTransmision.setCodigoLista(Constante.LISTA.CODIGO.TRANSMISION);
		
		cargarMarcas();
	}
	
	private void cargarMarcas(){
		lstMarcas = modeloMarcaService.buscarHijos(new ModeloMarca(Constante.MODELO_MARCA.TRANSPORTE.AUTO));
		cmbMarca.setContainerDataSource(new BeanItemContainer<ModeloMarca>(ModeloMarca.class,  lstMarcas));
		cmbMarca.setItemCaptionPropertyId("nombre");
		cmbMarca.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
		cmbMarca.setImmediate(true);
		cmbMarca.addListener(new ValueChangeListener() {
			
			private static final long serialVersionUID = -3624342478575320920L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				cargarModelosChange(event);
			}

			private void cargarModelosChange(ValueChangeEvent event) {
				lstModelos = modeloMarcaService.buscarHijos((ModeloMarca) cmbMarca.getValue());
				cmbModelo.setContainerDataSource(new BeanItemContainer<ModeloMarca>(ModeloMarca.class,  lstModelos));
				cmbModelo.setItemCaptionPropertyId("nombre");
				cmbModelo.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
				if (lstModelos.size() != 0) cmbModelo.setEnabled(true);
				else cmbModelo.setEnabled(false);
			}
		});
	}
	
	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnRegistrarVehiculo)){
			Vehiculo vehiculo = new Vehiculo();
			vehiculo.setTipoTamano((Valor) cmbTipo.getValue());
			vehiculo.setTransmision((Valor) cmbTransmision.getValue());
			vehiculo.setCilindros((Valor) cmbCilindraje.getValue());
			vehiculo.setColor((Valor) cmbColor.getValue());
			vehiculo.setPeriodoFabricacion((Valor) cmbPeriodo.getValue());
			vehiculo.setPlaca(txtPlaca.getValue() != null ? txtPlaca.getValue().toString() : StringUtils.EMPTY);
			vehiculo.setSerieChasis(txtSerieChasis.getValue() != null ? txtSerieChasis.getValue().toString() : StringUtils.EMPTY);
			vehiculo.setSerieMotor(txtSerieMotor.getValue() != null ? txtSerieMotor.getValue().toString() : StringUtils.EMPTY);
			vehiculo.setModeloEspecifico(txtModeloEspecifico.getValue() != null ? txtModeloEspecifico.getValue().toString() : StringUtils.EMPTY);
			vehiculo.setModeloMarca((ModeloMarca) cmbModelo.getValue());
			vehiculoService.crear(vehiculo);
			
			AlertDialog alertDialog = new  AlertDialog("Registro de Vehiculo", "Se ha registrado el vehículo correctamente", "Aceptar", "400");
			getApplication().getMainWindow().addWindow(alertDialog);
			
			btnRegistrarVehiculo.setEnabled(false);
			setVehiculo(vehiculo);
			detach();
			getApplication().getMainWindow().removeWindow(getWindow());
			
		}
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("500px");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("500px");
		setHeight("-1px");
		
		// pnlBody
		pnlBody = buildPnlBody();
		mainLayout.addComponent(pnlBody);
		mainLayout.setComponentAlignment(pnlBody, new Alignment(20));
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlBody() {
		// common part: create layout
		pnlBody = new VerticalLayout();
		pnlBody.setStyleName("h2");
		pnlBody.setCaption("Registro de Vehículo");
		pnlBody.setImmediate(false);
		pnlBody.setWidth("-1px");
		pnlBody.setHeight("-1px");
		pnlBody.setMargin(true);
		pnlBody.setSpacing(true);
		
		// pnl1
		pnl1 = buildPnl1();
		pnlBody.addComponent(pnl1);
		
		// pnl2
		pnl2 = buildPnl2();
		pnlBody.addComponent(pnl2);
		
		// pnl3
		pnl3 = buildPnl3();
		pnlBody.addComponent(pnl3);
		
		// pnl4
		pnl4 = buildPnl4();
		pnlBody.addComponent(pnl4);
		
		// pnl6
		pnl6 = buildPnl6();
		pnlBody.addComponent(pnl6);
		pnlBody.setComponentAlignment(pnl6, new Alignment(20));
		
		return pnlBody;
	}

	@AutoGenerated
	private HorizontalLayout buildPnl1() {
		// common part: create layout
		pnl1 = new HorizontalLayout();
		pnl1.setImmediate(false);
		pnl1.setWidth("-1px");
		pnl1.setHeight("-1px");
		pnl1.setMargin(false);
		pnl1.setSpacing(true);
		
		// cmbTipo
		cmbTipo = new ComboBoxLOVS();
		cmbTipo.setCaption("Tipo de Tamaño");
		cmbTipo.setImmediate(false);
		cmbTipo.setWidth("150px");
		cmbTipo.setHeight("-1px");
		pnl1.addComponent(cmbTipo);
		
		// cmbTransmision
		cmbTransmision = new ComboBoxLOVS();
		cmbTransmision.setCaption("Transmisión");
		cmbTransmision.setImmediate(false);
		cmbTransmision.setWidth("150px");
		cmbTransmision.setHeight("-1px");
		pnl1.addComponent(cmbTransmision);
		
		// cmbCilindraje
		cmbCilindraje = new ComboBoxLOVS();
		cmbCilindraje.setCaption("Nro. de Cilindros");
		cmbCilindraje.setImmediate(false);
		cmbCilindraje.setWidth("150px");
		cmbCilindraje.setHeight("-1px");
		pnl1.addComponent(cmbCilindraje);
		
		return pnl1;
	}

	@AutoGenerated
	private HorizontalLayout buildPnl2() {
		// common part: create layout
		pnl2 = new HorizontalLayout();
		pnl2.setImmediate(false);
		pnl2.setWidth("-1px");
		pnl2.setHeight("-1px");
		pnl2.setMargin(false);
		pnl2.setSpacing(true);
		
		// cmbColor
		cmbColor = new ComboBoxLOVS();
		cmbColor.setCaption("Color");
		cmbColor.setImmediate(false);
		cmbColor.setWidth("150px");
		cmbColor.setHeight("-1px");
		pnl2.addComponent(cmbColor);
		
		// cmbPeriodo
		cmbPeriodo = new ComboBoxLOVS();
		cmbPeriodo.setCaption("Año");
		cmbPeriodo.setImmediate(false);
		cmbPeriodo.setWidth("150px");
		cmbPeriodo.setHeight("-1px");
		pnl2.addComponent(cmbPeriodo);
		
		// txtPlaca
		txtPlaca = new TextField();
		txtPlaca.setCaption("Placa");
		txtPlaca.setImmediate(false);
		txtPlaca.setWidth("140px");
		txtPlaca.setHeight("-1px");
		txtPlaca.setRequired(true);
		txtPlaca.setInputPrompt("Nro. de Placa");
		pnl2.addComponent(txtPlaca);
		
		return pnl2;
	}

	@AutoGenerated
	private HorizontalLayout buildPnl3() {
		// common part: create layout
		pnl3 = new HorizontalLayout();
		pnl3.setImmediate(false);
		pnl3.setWidth("-1px");
		pnl3.setHeight("-1px");
		pnl3.setMargin(false);
		pnl3.setSpacing(true);
		
		// txtSerieChasis
		txtSerieChasis = new TextField();
		txtSerieChasis.setCaption("Serie del Chasis");
		txtSerieChasis.setImmediate(false);
		txtSerieChasis.setWidth("120px");
		txtSerieChasis.setHeight("-1px");
		txtSerieChasis.setInputPrompt("Nro. Serie Chasis");
		pnl3.addComponent(txtSerieChasis);
		
		// txtSerieMotor
		txtSerieMotor = new TextField();
		txtSerieMotor.setCaption("Serie del Motor");
		txtSerieMotor.setImmediate(false);
		txtSerieMotor.setWidth("120px");
		txtSerieMotor.setHeight("-1px");
		txtSerieMotor.setInputPrompt("Nro. Serie del Motor");
		pnl3.addComponent(txtSerieMotor);
		
		// txtModeloEspecifico
		txtModeloEspecifico = new TextField();
		txtModeloEspecifico.setCaption("Modelo Especifico");
		txtModeloEspecifico.setImmediate(false);
		txtModeloEspecifico.setWidth("200px");
		txtModeloEspecifico.setHeight("24px");
		txtModeloEspecifico.setInputPrompt("Modelo más especifico");
		pnl3.addComponent(txtModeloEspecifico);
		
		return pnl3;
	}

	@AutoGenerated
	private HorizontalLayout buildPnl4() {
		// common part: create layout
		pnl4 = new HorizontalLayout();
		pnl4.setImmediate(false);
		pnl4.setWidth("-1px");
		pnl4.setHeight("-1px");
		pnl4.setMargin(false);
		pnl4.setSpacing(true);
		
		// cmbMarca
		cmbMarca = new ComboBox();
		cmbMarca.setCaption("Marcas");
		cmbMarca.setImmediate(false);
		cmbMarca.setWidth("220px");
		cmbMarca.setHeight("-1px");
		pnl4.addComponent(cmbMarca);
		
		// cmbModelo
		cmbModelo = new ComboBox();
		cmbModelo.setCaption("Modelo");
		cmbModelo.setImmediate(false);
		cmbModelo.setWidth("220px");
		cmbModelo.setHeight("-1px");
		pnl4.addComponent(cmbModelo);
		
		return pnl4;
	}

	@AutoGenerated
	private HorizontalLayout buildPnl6() {
		// common part: create layout
		pnl6 = new HorizontalLayout();
		pnl6.setImmediate(false);
		pnl6.setWidth("-1px");
		pnl6.setHeight("-1px");
		pnl6.setMargin(true);
		pnl6.setSpacing(true);
		
		// btnRegistrarVehiculo
		btnRegistrarVehiculo = new Button();
		btnRegistrarVehiculo.setCaption("Grabar");
		btnRegistrarVehiculo.setImmediate(true);
		btnRegistrarVehiculo.setWidth("-1px");
		btnRegistrarVehiculo.setHeight("-1px");
		pnl6.addComponent(btnRegistrarVehiculo);
		
		return pnl6;
	}
}
